package common.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import common.constant.Constants;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;


@Component
public class TokenUtils {


    /**
     * 获取token
     *
     * @param userId       用户id
     * @param secret       token密钥
     * @param appId        小程序appId
     * @param appSecret    小程序secret
     * @param franchiseeId 加盟商id
     * @return
     */
    public static String getToken(Map<String, Object> map) {

        //头部信息
        Map<String, Object> header = new HashMap<>(2);
        header.put("type", "JWT");
        header.put("alg", "HS512");
        long date = System.currentTimeMillis();
        Algorithm algorithm = Algorithm.HMAC512(map.get(Constants.TOKEN_SECRET).toString());
        JWTCreator.Builder builder = JWT.create()
                .withHeader(header)
                //用户id 使用base64加密
                //.withClaim(Constants.TOKEN_USER_ID, Base64Utils.base64Encoder(userId))
                .withClaim(Constants.TOKEN_UPDATE_TIME, date);
        Set<String> set = map.keySet();
        for (String key : set) {
            builder.withClaim(key, map.get(key).toString());
        }
        // builder.withIssuedAt(iatDate)//设置签发时间
        // builder.withExpiresAt(expiresDate)//设置过期时间 过期时间大于签发时间
        return builder.sign(algorithm);
    }

    /**
     * 校验 token 是否正确 通过tokenSecret 校验
     * true正确  false错误
     */
    public static boolean verifyToken(String token, String secret) {
        try {
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC512(secret)).build();
            jwtVerifier.verify(token);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 校验 token 是否过期
     * true已过期 false未过期
     */
    public static boolean isExpireTime(String token, String expireTime) {
        //更新时间+有效时间 与 当前时间 比较
        return JWT.decode(token).getClaim(Constants.TOKEN_UPDATE_TIME).asLong() + Long.parseLong(expireTime) < System.currentTimeMillis();
    }

    /**
     * 获取userId
     *
     * @param token
     * @return
     */
    public static String getUserId(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_USER_ID).asString();
    }

    /**
     * 获取userType
     *
     * @param token
     * @return
     */
    public static String getUserType(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_USER_TYPE).asString();
    }

    /**
     * 获取userName
     *
     * @param token
     * @return
     */
    public static String getUserName(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_USER_NAME).asString();
    }

    /**
     * 获取userAccount
     *
     * @param token
     * @return
     */
    public static String getUserAccount(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_USER_ACCOUNT).asString();
    }

    /**
     * 获取小程序appid
     *
     * @param token
     * @return
     */
    public static String getAppId(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_APP_ID).asString();
    }

    /**
     * 获取小程序appSecret
     *
     * @param token
     * @return
     */
    public static String getAppSecret(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_APP_SECRET).asString();
    }

    /**
     * 获取加盟商id
     *
     * @param token
     * @return
     */
    public static String getFranchiseeId(String token) {
        return JWT.decode(token).getClaim(Constants.TOKEN_FRANCHISEE_ID).asString();
    }
}

